package android.slc.mp.ui;

import android.content.Context;
import android.os.Bundle;

import androidx.collection.ArrayMap;

import android.slc.ml.bean.i.IPropertyFile;
import android.slc.mp.po.SelectEvent;
import android.slc.mp.po.i.IBaseItem;

import java.util.List;
import java.util.Map;

/**
 * Created by slc
 */
public interface SlcIMpDelegate {
    /**
     * 获取文件选择参数
     *
     * @return
     */
    Bundle getParameter();

    /**
     * 获取上下文环境
     *
     * @return
     */
    Context getContext();

    /**
     * 获取显示的媒体类型集合
     *
     * @return
     */
    List<Integer> getMediaTypeList();

    /**
     * 获取允许混选的文件集合
     *
     * @return
     */
    List<Integer> getMediaTypeMuddyList();

    /**
     * 获取选择的文件集合
     *
     * @return
     */
    ArrayMap<Long, IBaseItem> getSelectItemArrayMap();

    /**
     * 获取文件筛选器集合
     *
     * @return
     */
    Map<Integer, IPropertyFile> getMediaTypeFilePropertyList();

    /**
     * 根据媒体类型获取文件筛选器
     *
     * @param mediaType
     * @return
     */
    IPropertyFile getFilePropertyWithMediaType(int mediaType);

    /**
     * 添加一个item(文件选择)
     *
     * @param baseItem
     * @return 返回true表示文件选择成功，false则反之
     */
    boolean addItem(IBaseItem baseItem);

    /**
     * 移除一个item(文件选择)
     *
     * @param baseItem
     * @return 返回true表示文件移除成功，false则反之
     */
    boolean removeItem(IBaseItem baseItem);

    /**
     * 添加所有(文件选择)
     * 全选逻辑未完成，需要判断多种类型混合逻辑和个数限制逻辑
     * @param baseItemList
     * @Deprecated 正常情况下不会有这种，除非没有选择个数限制
     */
    @Deprecated
    void addAll(List<IBaseItem> baseItemList);

    /**
     * 移除所有(文件选择)
     */
    void removeAll();

    /**
     * 获取listView一行的个数
     *
     * @return
     */
    int getSpanCount();

    /**
     * 获取当前选择的item个数
     *
     * @return
     */
    int getSelectItemCount();


    /**
     * 获取当前选择的item个数
     *
     * @return
     */
    int getSelectItemCountByMediaType(int mediaType);

    /**
     * 获取选择的最大个数
     *
     * @return
     */
    int getMaxCount();

    /**
     * 根据媒体类型获取最大可选数
     * 如果未配置则使用 getMaxCount()
     * @param mediaType
     * @return
     */
    default int getMaxCountByMediaType(int mediaType) {
        return getMaxCountByMediaType(mediaType, true);
    }

    /**
     * 根据媒体类型获取最大可选数
     * @param mediaType
     * @param isNullApplyGlobalMax 当获取的对应的媒体类型最大个数为null时，是否应用全局的MaxCount，true则返回 getMaxCount()
     * @return
     */
    Integer getMaxCountByMediaType(int mediaType, boolean isNullApplyGlobalMax);

    /**
     * 是否允许选择多个
     *
     * @return
     */
    boolean isMultipleSelection();

    /**
     * 是否允许同时选择多个媒体类型
     *
     * @return
     */
    boolean isMultipleMediaType();

    /**
     * 添加选择事件监听
     *
     * @param onSelectEventListener
     */
    void addOnSelectEventListener(OnSelectEventListener onSelectEventListener);


    /**
     * 根据媒体类型获取title
     *
     * @param mediaType
     * @return
     */
    String getTitleByMediaType(int mediaType);

    /**
     * 根据index获取title
     *
     * @param position
     * @return
     */
    String getTitleByPosition(int position);

    /**
     * 选择完成
     */
    void complete();

    /**
     * 销毁
     */
    void destroy();

    /**
     * 文件选择事件监听器
     */
    interface OnSelectEventListener {
        /**
         * 事件
         *
         * @param eventCode 事件码
         * @param event     事件主体
         * @return
         */
        Object onSelectEvent(int eventCode, SelectEvent event);

        int getListenerMediaType();

    }
}
